# -*- coding: utf8 -*-
import sys, os
from PIL import Image, ImageDraw


# 二值数组
t2val = {}
def twoValue(image, G):
    # 根据图片大小生成一个二维坐标
    for y in range(0, image.size[1]):
        for x in range(0, image.size[0]):
            g = image.getpixel((x, y)) # 获取每一个像素的坐标点
            # 通过判断对应坐标的像素点是否大于一个阈值G,来进行二值化处理
            if g > G:
                t2val[(x, y)] = 1
            else:
                t2val[(x, y)] = 0

def clearNoise(image, N, Z):
    '''
     邻域降噪
        前提是将图片灰度化，即将彩色图像转化为灰度图像。
        彩色图像中每个像素的颜色由R 、G、B三个分量决定，每个分量由0到255种取值，这个一个像素点可以有一千多万种颜色变化。
        而灰度则是将三个分量转化成一个，使每个像素点只有0-255种取值，这样可以使后续的图像计算量变得少一些。
        以灰度图片为例，图片越接近白色的点像素越接近255，越接近黑色的点像素越接近0，而且验证码字符肯定是非白色的。
        对于其中噪点大部分都是孤立的小点的，而且字符都是串联在一起的。
        8邻域降噪 的原理就是依次遍历图中所有非白色的点，计算其周围8个点中属于非白色点的个数，如果数量小于一个固定值，那么这个点就是噪点。
        对于不同类型的验证码这个阈值是不同的，所以可以在程序中配置，不断尝试找到最佳的阈值。
    :param image: image
    :param N: Integer 降噪率 0 <N <8
    :param Z: Integer 降噪次数
    :return: None
    '''
    for i in range(0, Z):
        t2val[(0, 0)] = 1
        t2val[(image.size[0] - 1, image.size[1] - 1)] = 1
        for x in range(1, image.size[0] - 1):
            for y in range(1, image.size[1] - 1):
                nearDots = 0
                L = t2val[(x, y)]
                if L == t2val[(x - 1, y - 1)]:
                    nearDots += 1
                if L == t2val[(x - 1, y)]:
                    nearDots += 1
                if L == t2val[(x - 1, y + 1)]:
                    nearDots += 1
                if L == t2val[(x, y - 1)]:
                    nearDots += 1
                if L == t2val[(x, y + 1)]:
                    nearDots += 1
                if L == t2val[(x + 1, y - 1)]:
                    nearDots += 1
                if L == t2val[(x + 1, y)]:
                    nearDots += 1
                if L == t2val[(x + 1, y + 1)]:
                    nearDots += 1

                if nearDots < N:
                    t2val[(x, y)] = 1

def saveImage(filename, size):
    image = Image.new("1", size)
    draw = ImageDraw.Draw(image)
    for x in range(0, size[0]):
        for y in range(0, size[1]):
            draw.point((x, y), t2val[(x, y)])
    image.save(filename)


# 获取图片路径
image_data_path = os.path.join(os.getcwd(),'image_data\\5001-10000')
print(image_data_path)
# 加载该路径下的所有图片
image_data = os.listdir(image_data_path)
# 保存图片
dir = 'process_image1000'
if not os.path.exists(dir):
    os.makedirs(dir)

for i in range(1000):
    # 加载图片
    image = Image.open(os.path.join(image_data_path,image_data[i]))
    # 将图进行灰度处理，L代表将图像转化为灰度图像
    image = image.convert('L')
    # 降噪处理
    twoValue(image, 185)
    clearNoise(image, 3, 1)
    path1 = 'new_'+str(i)+".jpg"
    file_path = os.path.join(dir, path1)
    saveImage(file_path, image.size)



if __name__ == '__main__':
    pass